﻿#pragma once
#include "boxline_data.h"


class Algorithm;
class WCSSend;
class ComponentBase;
class Boxline
{
public:
	Boxline(const QString& id);
	~Boxline();

	bool Init();
	// 判读是否有货, 有货返回1, 无货返回0, 异常返回 -1
	int GetState();

	// 获取当前位置货物数量
	int GetSkuNum();

	/*更新物料尺寸信息*/
	bool UpdateSkuInfo(const SkuInfo& sku);
	/*算法计算, index: 抓取次数， num: 抓取数量*/
	bool CalculateNextGrab(int index, int num, QString& err);
	/*获取抓取坐标, index: 抓取次数， pos:坐标*/
	bool GetSkuPosition(int index, Position& pos);

	// 设置物料移走或到位
	bool SetSkuMoved();
	bool SetSkuArrived(int num, QString SkuNo = "");

	// 改变物料到位状态
	bool ChangeBoxlineState(int state);
private:
	bool GetBoxlineState();
	// 返回值：0:校验通过，1：校验不通过，-1：校验异常
	int CheckBoxlineDI(const bool state);
private:
	QString m_id;
	QString m_robName;
	BoxlineType m_type = BoxlineType::boxline_type_max;
	struct {
		bool state;	// 是否有货
		int num;
		SkuInfo sku;
	} m_state = {};

	Algorithm* m_alg = nullptr;

	struct {
		int index;
		Position pos;
	} m_algResult = {};
	QVector<int> m_di;
	QVector<QString> m_dival;

	ComponentBase* m_rob = nullptr;
	WCSSend* m_wcs = nullptr;
};
